/*
Date:20210430 AM
key:唯一出现一次，其余出现n次的最好通解。位计算。开一个32的int，每一个数字对应的二进制位加入数组对应位置。
    类似于竖着做加法。然后都32数组的每一个modn。最后这个结果再转化为二进制数即可。注意逐个读取二进制是右移操作。
*/
class Solution {
public:
    
    int singleNumber(vector<int>& nums) 
    {
        int A[32];
        memset(A,0,sizeof(A));
        for(int j:nums)
        {
            for(int i=0;i<32;i++)
            {
                if(((j>>i)&1)==1){A[i]++;}
                //j>>1;
            }
            
        }
        
        for(int i=0;i<32;i++){A[i]%=3;}
        
        int re=0;
        for(int i=31;i>-1;i--)
        {
            re=re<<1;
            if(A[i])
            {re++;}
            
        }
        return re;
    }
    
};